可以在 ruby 裡使用 select 方法來篩選陣列的物件,例如可以在陣列裡找出所有偶數的值。如果不用 select 方法可以這樣做:
even_numbers = []
[1,2,3,4,5,6].each do |n|
if n.even?
even_numbers << n
end
end
even_numbers
以這麼簡單的目的來說,這樣程式碼算有點長,現在來看看 select 方法怎麼做。使用 select 方法需要一個 block。在一個 block 裡需要回傳 true 或是 false,這樣 select 方法就可以對陣列做篩選,這裡也會用到一些布林值多看多學。
[1,2,3,4,5,6].select { |n| n.even? }
這段程式碼跟一個範例是一樣的,但是少了很多程式碼。事實上還可以這樣寫:
[1,2,3,4,5,6].select(&:even?)
這樣的簡寫只在“對陣列裡每個元素呼叫一個方法”的時後有用。除了陣列以外也可以對雜湊呼叫。
stock = {
apples: 10,
oranges: 5,
bananas: 1
}
stock.select { |k, v| v > 1 }
# {:apples=>10, :oranges=>5}
k 代表 key & v 代表 values,上面的程式碼翻成白話文的意思就是說:
"找到所有庫存大於 1 的水果"
可以用許多的方法結合 select 一起使用,最常用的是 with_index 方法。
fruits = %w(apple orange banana)
fruits.select.with_index { |word, idx| idx.even? }
# ["apple", "banana"]
這個方法可以使用 index 來代替物件本身篩選(以這裡的例子是字串)。對陣列使用 select 方法永遠會產生一個陣列,如果想要改變原始的陣列可以使用 select! 方法。
fruits = %w(apple orange banana)
fruits.select! { |fruit| fruit.start_with? "a" }
# ["apple"]
在方法結尾加上驚嘆號 (select!) 會回傳一個新的物件改變原本的物件,但是語言本身不會強制執行這個規則。
想要篩選表單的時候 select 方法是很好的選擇,得到一個陣列的結果。如果只想要找到一個物件呢?可以使用 find 方法
letters = %w(a aa aaa aaaa)
letters.find { |l| l.size == 3 }
# "aaa"
letters.find { |l| l.size == 10 }
# nil
Find 方法會找到第一個符合條件的物件,沒有找到符合的會得到 nil。
如果對 find_all 方法與其他 find & select 感到疑惑,其實沒有這麼複雜,find_all 方法是 select 的別名。find 方法可以找到單一特定物件而不是多個物件。
可以把元素移除而不是像 select 方法選擇出來,也是可以用 select 做到:
[1,2,3,4,5,6].select { |n| n != 4 }
reject 方法可以解決這個問題。
[1,2,3,4,5,6].reject { |n| n == 4 }
沒有任何技術、效能問題或其他條件,但會讓你的程式碼有更好的閱讀性。